#ifndef SQLDATABASE_H
#define SQLDATABASE_H

#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QSqlError>
#include <QMutex>
#include <QMutexLocker>
#include <QDebug>

#include "common.h"

class SqlDatabase {
public:
    // 获取单例对象
    static SqlDatabase* instance(const QString& server = SERVER, const QString& database = DATABASE, const QString& user = USER, const QString& password = PASSWORD);

    // 释放单例实例
    static void release();

    // 打开数据库连接
    bool open();

    // 关闭数据库连接
    void close();

    // 获取数据库连接状态
    bool isOpen() const;

    // 执行 SQL 查询
    QSqlQuery executeQuery(const QString& queryStr);

    // 提供原始的 QSqlDatabase 对象，用户可用于事务等操作
    QSqlDatabase database() const;

private:
    // 私有构造函数，确保单例模式
    SqlDatabase(const QString& server, const QString& database, const QString& user, const QString& password);
    ~SqlDatabase();

    // 禁止拷贝构造和赋值
    SqlDatabase(const SqlDatabase&) = delete;
    SqlDatabase& operator=(const SqlDatabase&) = delete;

    // 封装数据库连接字符串
    QString buildConnectionString() const;

    // 封装自动重连机制
    bool reconnect();

    // 静态成员，保存单例实例
    static SqlDatabase* m_instance;

    // 线程安全锁
    static QMutex m_mutex;

    // 数据库连接
    QSqlDatabase m_db;

    // 数据库连接参数
    QString m_server;
    QString m_database;
    QString m_user;
    QString m_password;

    bool m_connected;  // 标识数据库是否连接

    int m_reconnect_count;// 重新连接次数
    int m_reconnect_max_count = 3;// 重连最大次数
};

#endif // SQLDATABASE_H
